﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web.Configuration;
using log4net;
using TheBullysStore.Models.ModuloAdministracion.Edificio;

namespace TheBullysStore.Models.ModuloAdministracion.Departamento
{
    public class DepartamentoDAO
    {
        public static String cadenaDB = WebConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
        private static ILog log = LogManager.GetLogger(typeof(DepartamentoDAO));

        public string RegistrarDepartamento(DepartamentoBean departamento)
        {
            SqlConnection sqlCon = null;
            try
            {
                sqlCon = new SqlConnection(cadenaDB);
                int tcontometro = 0;
                log.Warn("El edificio: \"" + tcontometro + "\"ya ha sido creado");
                sqlCon.Open();

                string commandString = "INSERT INTO Departamento (Id_Edificio, Nombre, Numero_Piso, Numero, Area, Numero_Banhos, Numero_Habitaciones, Estado, EsDeudor)" +
                                       " VALUES (" + departamento.IdEdificio + ",'" + departamento.Nombre + "','" + departamento.NumeroPiso + "'," + departamento.Numero + "," + departamento.Area + "," + departamento.NumeroBanhos + "," + departamento.NumeroHabitaciones + ",1,0)";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCmd.ExecuteNonQuery();

                commandString = "SELECT max(id_departamento) from Departamento where Numero="+departamento.Numero+" and Numero_Piso='"+departamento.NumeroPiso+"' and id_edificio="+departamento.IdEdificio+" and estado=1 ";

                sqlCmd = new SqlCommand(commandString, sqlCon);

                int iddepartamento = System.Convert.ToInt32(sqlCmd.ExecuteScalar());

                commandString = "select contometro from edificio where estado=1 and id_edificio=" + departamento.IdEdificio + " ";
                sqlCmd = new SqlCommand(commandString, sqlCon);
                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    if (Convert.IsDBNull(dataReader[0])) { tcontometro = 0; } else { tcontometro = Convert.ToInt32(dataReader[0]); }
                }
                
                dataReader.Close();


                for (int i = departamento.AnioActual; i <= 2016; i++) {

                        for (int j = 1; j <= 12; j++)
                        {
                            commandString = "INSERT INTO cuenta_por_cobrar (id_departamento,anio,mes,estado)" +
                                                    " VALUES (" + iddepartamento + ", " + i + ", " + j + ", 1)";

                            sqlCmd = new SqlCommand(commandString, sqlCon);
                            sqlCmd.ExecuteNonQuery();

                            commandString = "SELECT max(id_cuenta) from cuenta_por_cobrar where id_departamento="+iddepartamento+" and anio="+i+" and mes="+j+" and estado=1 ";

                            sqlCmd = new SqlCommand(commandString, sqlCon);

                            int idcuenta = System.Convert.ToInt32(sqlCmd.ExecuteScalar());

                            if (tcontometro != 1)
                            {

                                commandString = "INSERT INTO consumo_de_agua (id_departamento,id_edificio,id_cuenta,anio,mes,estado)" +
                                                        " VALUES (" + iddepartamento + ", " + departamento.IdEdificio + ", " + idcuenta + ", " + i + ", " + j + ", 1) ";

                                sqlCmd = new SqlCommand(commandString, sqlCon);
                                sqlCmd.ExecuteNonQuery();

                            }

                             commandString = "INSERT INTO cuota (id_departamento,id_edificio,id_cuenta,anio,mes,estado)" +
                                                 " VALUES (" + iddepartamento + ", " + departamento.IdEdificio + ", " + idcuenta + ", " + i + ", " + j + ", 1) ";
                             sqlCmd = new SqlCommand(commandString, sqlCon);
                             sqlCmd.ExecuteNonQuery();               
                    }      
                }

                    departamento.Conexion = "Bien";
            }
            catch (Exception ex)
            {
                log.Error("registrarDepartamento(EXCEPTION): ", ex);
                throw ex;
            }
            finally {
                sqlCon.Close();
            }

            return departamento.Conexion;
        }

        public Boolean ExisteDepartamento(DepartamentoBean departamento)
        {
            SqlConnection sqlCon = null;
            try
            {
                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "SELECT * FROM Departamento WHERE Id_Edificio = " + departamento.IdEdificio + " AND Numero = " + departamento.Numero + " AND estado = 1";


                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                if (dataReader.Read())
                {
                    dataReader.Close();
                    return true;
                }
                else
                {
                    dataReader.Close();
                    return false;
                }
            }
            catch (Exception ex)
            {
                log.Error("existeDepartamento(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
        }

        public List<DepartamentoBean> ListarDepartamento(DepartamentoBean departamento)
        {
            SqlConnection sqlCon = null;
            try
            {
                List<DepartamentoBean> listadepartamento = new List<DepartamentoBean>();

                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "SELECT * FROM Departamento WHERE estado = 1";

                if (departamento.IdEdificio > 0)
                {
                    commandString += " AND Id_Edificio = " + departamento.IdEdificio + "";
                }
                if (!string.IsNullOrEmpty(departamento.Nombre))
                {
                    commandString += " AND Nombre = '" + departamento.Nombre + "'";
                }
                if (!string.IsNullOrEmpty(departamento.NumeroPiso))
                {
                    commandString += " AND Numero_Piso = '" + departamento.NumeroPiso + "'";
                }
                if (departamento.Numero>0)
                {
                    commandString += " AND Numero = '" + departamento.Numero + "'";
                }
                if (departamento.NumeroHabitaciones>0)
                {
                    commandString += " AND Numero_Habitaciones = " + departamento.NumeroHabitaciones + "";
                }
                if (departamento.NumeroBanhos>0)
                {
                    commandString += " AND Numero_Banhos = " + departamento.NumeroBanhos + "";
                }

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    DepartamentoBean Departamento = new DepartamentoBean();

                    Departamento.IdEdificio = Convert.ToInt32(dataReader["Id_Edificio"]);
                    Departamento.IdDepartamento = Convert.ToInt32(dataReader["Id_Departamento"]);
                    Departamento.Nombre = Convert.ToString(dataReader["Nombre"]);
                    Departamento.Numero = Convert.ToInt32(dataReader["Numero"]);
                    Departamento.NumeroPiso = Convert.ToString(dataReader["Numero_Piso"]);
                    Departamento.NumeroBanhos = Convert.ToInt32(dataReader["Numero_Banhos"]);
                    Departamento.NumeroHabitaciones = Convert.ToInt32(dataReader["Numero_Habitaciones"]);
                    Departamento.Area = Convert.ToDouble(dataReader["Area"]);

                    SqlConnection sqlCon2 = new SqlConnection(cadenaDB);

                    sqlCon2.Open();

                    string commandString2 = "SELECT * FROM Edificio WHERE estado= 1 AND Id_Edificio = " + Departamento.IdEdificio + "";

                    SqlCommand sqlCmd2 = new SqlCommand(commandString2, sqlCon2);

                    SqlDataReader dataReader2 = sqlCmd2.ExecuteReader();

                    while (dataReader2.Read())
                    {
                        Departamento.NombreEdificio = Convert.ToString(dataReader2["Nombre"]);

                    }

                    dataReader2.Close();
                    sqlCon2.Close();

                    listadepartamento.Add(Departamento);
                }

                dataReader.Close();

                return listadepartamento;
            }
            catch (Exception ex)
            {
                log.Error("listarDepartamento(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
        }

        public string ModificarDepartamento(DepartamentoBean departamento)
        {
            SqlConnection sqlCon = null;
            try
            {
                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "UPDATE Departamento SET " + 
                                       "Numero_Banhos = " + departamento.NumeroBanhos + ", " +
                                       "Numero_Piso = '" + departamento.NumeroPiso + "', " +
                                       "Area = " + departamento.Area + ", " +
                                       "Id_Edificio = " + departamento.IdEdificio + ", " +
                                       "Numero = " + departamento.Numero + ", " +
                                       "Nombre = '" + departamento.Nombre + "', " +
                                       "Numero_Habitaciones = " + departamento.NumeroHabitaciones + " " +                     
                                       "WHERE Id_Departamento = " + departamento.IdDepartamento + "";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                sqlCmd.ExecuteNonQuery();

                departamento.Conexion = "Bien";
            }
            catch (Exception ex)
            {
                log.Error("ModificarDepartamento(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }

            return departamento.Conexion;
        }

        public string EliminarDepartamento(DepartamentoBean departamento)
        {
            SqlConnection sqlCon = null;
            try {

                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "UPDATE Departamento SET Estado = 0 WHERE Id_Departamento = " + departamento.IdDepartamento + "";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCmd.ExecuteNonQuery();

                departamento.Conexion = "Bien";
            
            }
            catch (Exception ex)
            {
                log.Error("EliminarDepartamento(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }

            return departamento.Conexion;
        }

        public void EliminarDepartamento(EdificioBean edificio) {
            SqlConnection sqlCon = null;
            try
            {
                sqlCon = new SqlConnection(cadenaDB);
                
                sqlCon.Open();

                string commandString = "UPDATE Departamento SET Estado = 0 WHERE Id_Edificio = " + edificio.IdEdificio + "";


                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCmd.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                log.Error("EliminarDepartamento(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
        }

        public void EliminarDepartamentoPiso(EdificioBean edificio)
        {
            SqlConnection sqlCon = null;
            try
            {
                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "UPDATE Departamento SET Estado = 0 WHERE Id_Edificio = " + edificio.IdEdificio +
                " AND SUBSTRING(Piso,2,LEN(Piso)- 1) > " + edificio.NumPisos + " AND SUBSTRING(Piso,1,1) = 'P'";

                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                log.Error("EliminarDepartamentoPiso(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
        }

        public void EliminarDepartamentoSotano(EdificioBean edificio)
        {
            SqlConnection sqlCon = null;
            try
            {
                sqlCon = new SqlConnection(cadenaDB);

                sqlCon.Open();

                string commandString = "UPDATE Departamento SET Estado = 0 WHERE Id_Edificio = " + edificio.IdEdificio +
                                       " AND SUBSTRING(Piso,2,LEN(Piso)- 1) > " + edificio.NumSotanos + " AND SUBSTRING(Piso,1,1) = 'S'";


                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                sqlCmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                log.Error("EliminarDepartamentoSotano(EXCEPTION): ", ex);
                throw ex;
            }
            finally
            {
                sqlCon.Close();
            }
        }
    }
}
